package music.utils.fileupload;

import javax.activation.MimetypesFileTypeMap;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.SocketException;
import java.net.URLEncoder;

/**
 * Created by pc01 on 11/12/2014.
 */
@WebServlet("/down.do")
public class DownloadTest extends HttpServlet {
    protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

        String attach = req.getParameter("fname");
        String fpath = "d:/FileUpload/";

        // 다운로드 할 첨부파일명 한글 처리
        String ua = req.getHeader("User-Agent");
        // 브라우저 식별
        String fname = URLEncoder.encode(attach, "UTF-8").replaceAll("\\+", "%20"); //IE
        if (ua.indexOf("Firefox") > 0) {                                            // FF, CR
            fname = new String(attach.getBytes("UTF-8"), "ISO-8859-1");
        }
        File f = new File(fpath, attach);

        // 다운로드 준비
        res.setContentType(new MimetypesFileTypeMap().getContentType(f));
        res.setContentLength((int) f.length());
        res.setHeader("Content-Transfer-Encoding", "binary");
        res.setHeader("Content-Disposition", "attachment; filename=" + fname.substring(13));


        // 다운로드 시작
        // 버퍼기능이 있는
        BufferedOutputStream outs = new BufferedOutputStream(res.getOutputStream());
        // 출력 방향은 res로, 즉 브라우저를 가리킴
        byte buf[] = new byte[8192];
        // 첨부파일을 빠르게 읽기위해 8kbyte의 버퍼 생성
        int read = 0;
        FileInputStream fis = null;
        BufferedInputStream bis = null;

        try {
            fis = new FileInputStream(f);
            bis = new BufferedInputStream(fis);

            while ((read = bis.read(buf)) != -1) {
                // bis로부터 buf 크기 만큼 ㅇ릭음
                // 그 결과 read에는 읽은 데이터 크기가 저장
                outs.write(buf, 0, read);
                // 출력 스트림으로 읽은 데이터 크기만큼 출력
                // 즉, buf에서 0부터 read 만큼 출력
                outs.flush();
            }
        } catch (SocketException se){
            // 다운로드 대화상자를 띄운 후
            // 취소 버튼ㅇ르 누르는 경우 발생하는 예외
            // 시스템 적인 문제라 특별히 처리할 필요는 없음
            // Tomcat 8 에서는 발생하지 않음
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            if (outs != null) try {outs.close();} catch (Exception e) {}
            if (bis != null) try {bis.close();} catch (Exception e) {}
            if (fis != null) try {fis.close();} catch (Exception e) {}
        }
    }
}
